package my_mybatis.mapper;

import my_mybatis.pojo.Brand;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * MyBatis 参数封装（推荐参数为集合或者是多个参数直接使用@Param注解修改Map集合中默认的键名，
 *                  并使用修改后的键名获取值，提高代码的阅读性）：
 *      * 单个参数：
 *          1.POJO类型：直接使用，属性名 和 参数占位符名称保持一致
 *          2.Map集合：直接使用，键名 和 参数占位符保持一致
 *          3.collection：封装为Map集合
 *              map.put("arg0",collection集合)
 *              map.put("collection",collection集合)
 *          4.List：封装为Map集合
 *              map.put("arg0",collection集合)
 *  *           map.put("collection",collection集合)
 *  *           map.put("List",List集合)
 *          5.Array：封装为Map集合
 *              map.put("arg0",数组)
 *  *  *        map.put("Array",数组)
 *          6.其他类型：直接使用
 *      * 多个参数：封装为Map集合，可以使用@Param注解，替换Map集合中默认的arg键名
 *          map.put("arg0",参数值1)
 *          map.put("param1",参数值1)
 *          map.put("arg1",参数值2)
 *          map.put("param2",参数值2)
 *          --------------@Param("参数名称1")
 *          map.put("参数名称1",参数值1)
*  *        map.put("param1",参数值1)
*  *        map.put("arg1",参数值2)
*  *        map.put("param2",参数值2)
 */
public interface BrandMapper {
    /**
     * 查询所有
     * @return 返回查找的Brand的对象集
     */
    List<Brand> selectAll();

    /**
     * 查看详情
     * @param id 通过id查询
     * @return 返回一个Brand对象
     */
    Brand selectById(int id);

    /**
     * 多条件动态查询
     * 参数接收：
     *      1.散装参数：如果方法中有多个参数，需要使用@Param("SQL参数占位符名称")注解
     *      2.对象参数：对象的属性名称要和对应的参数占位符名称保持一致
     *      3.map集合参数：集合的键要和对应的参数占位符名称保持一致，值就是查询的值
     * @param status 状态
     * @param companyName 公司名称
     * @param brandName 品牌名称
     * @return 返回一个Brand集合
     */
    List<Brand> selectByCondition(
            @Param("status") int status, @Param("companyName") String companyName,
            @Param("brandName") String brandName
    );

    List<Brand> selectByCondition(Brand brand);
    List<Brand> selectByCondition(Map map);

    /**
     * 单条件动态查询
     * @param brand 封装的brand对象
     * @return 返回一个List集合
     */
    List<Brand> selectByConditionSingle(Brand brand);

    /**
     * 添加操作
     * @param brand 传递一个brand对象
     */
    void add(Brand brand);

    /**
     * 修改一条数据
     * @param brand 参数为brand对象
     * @return 返回值为影响的行数
     */
    int update(Brand brand);

    /**
     * 删除单个元素
     * @param id 要删除的id
     */
    void deleteById(int id);

    void deleteMore(@Param("ids") List<Integer> list);
}
